﻿using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace hyjiacan.py4n.data
{
    /// <summary>
    /// 使用姓氏数据库查询
    /// </summary>
    internal class NameDB
    {
        // 实例
        private static NameDB instance;

        private readonly Dictionary<string, string> dataMap;

        /// <summary>
        ///  获取单实例
        /// </summary>
        public static NameDB Instance
        {
            get { return instance ?? (instance = new NameDB()); }
        }

        /// <summary>
        /// 私有构造
        /// </summary>
        private NameDB()
        {
            dataMap = new Dictionary<string, string>();

            LoadResource();
        }

        /// <summary>
        /// 更新数据字典
        /// </summary>
        /// <param name="data"></param>
        /// <param name="replace"></param>
        public void Update(Dictionary<string, string[]> data, bool replace = false)
        {
            foreach (var item in data)
            {
                if (!dataMap.ContainsKey(item.Key))
                {
                    dataMap.Add(item.Key, string.Join(" ", item.Value));
                    continue;
                }
                if (!replace)
                {
                    continue;
                }
                dataMap[item.Key] = string.Join(" ", item.Value);
            }
        }

        /// <summary>
        /// 加载拼音库资源
        /// </summary>
        public void LoadResource()
        {
            foreach (var row in DATA.Split('\n'))
            {
                if (string.IsNullOrEmpty(row))
                {
                    continue;
                }
                var temp = row.Split('=');
                // 取姓
                var name = temp[0];

                // 取拼音串 小心有个 \r 的回车符号
                var pinyin = temp[1].Trim();

                dataMap.Add(name, pinyin.Replace(",", " "));
            }
        }
        /// <summary>
        /// 获取汉字的拼音
        /// </summary>
        /// <param name="hanzi"></param>
        /// <returns>若未找到汉字拼音，则返回空</returns>
        public string GetPinyin(string hanzi)
        {
            return dataMap.ContainsKey(hanzi) ? dataMap[hanzi] : null;
        }

        /// <summary>
        /// 根据拼音获取汉字
        /// </summary>
        /// <param name="pinyin">拼音</param>
        /// <param name="matchAll">是否全部匹配，为true时，匹配整个拼音，否则匹配开头字符，此参数用于告知传入的拼音是完整拼音还是仅仅是声母</param>
        /// <returns></returns>
        public IEnumerable<string> GetHanzi(string pinyin, bool matchAll)
        {
            var reg = new Regex("[0-9]");
            // 完全匹配
            if (matchAll)
            {
                // 此时将拼音中的 v 处理成 u: ，将 lyu 处理成 lu:
                pinyin = pinyin.Replace("v", "u:").Replace("lyu", "lu:");
                // 查询到匹配的拼音的汉字
                return dataMap.Where(item => reg.Replace(item.Value, "").Equals(pinyin))
                    .Select(item => item.Key).ToArray();
            }
            // 匹配开头部分
            else
            {
                // 查询到匹配的拼音的unicode编码
                return dataMap.Where(item => reg.Replace(item.Value, "").StartsWith(pinyin))
                    .Select(item => item.Key).ToArray();
            }
        }

        private const string DATA = @"阿=a1
哀=ai1
爱=ai4
艾=ai4
爱新觉罗=ai4,xin1,jue2,luo2
安=an1
昂=ang2
敖=ao2
巴=ba1
白=bai2
百=bai3
柏=bai3
百里=bai3,li3
拜=bai4
班=ban1
板=ban3
包=bao1
褒=bao1
宝=bao3
保=bao3
暴=bao4
鲍=bao4
卑=bei1
北=bei3
邶=bei4
孛=bei4
贝=bei4
贲=ben1
本=ben3
碧=bi4
闭=bi4
毕=bi4
碧鲁=bi4,lu3
边=bian1
卞=bian4
表=biao3
别=bie2
宾=bin1
邴=bing3
丙=bing3
波=bo1
薄=bo2
伯=bo2
帛=bo2
卜=bu3
布=bu4
不=bu4
步=bu4
才=cai2
蔡=cai4
苍=cang1
操=cao1
曹=cao2
岑=cen2
柴=chai2
单于=chan2,yu2
昌=chang1
常=chang2
畅=chang4
钞=chao1
抄=chao1
潮=chao2
巢=chao2
晁=chao2
车=che1
辰=chen2
陈=chen2
称=cheng1
城=cheng2
承=cheng2
澄=cheng2
程=cheng2
乘=cheng2
成=cheng2
迟=chi2
池=chi2
赤=chi4
充=chong1
崇=chong2
丑=chou3
初=chu1
出=chu1
鉏=chu2
楚=chu3
储=chu3
褚=chu3
春=chun1
淳于=chun2,yu2
慈=ci2
次=ci4
丛=cong2
从=cong2
崔=cui1
翠=cui4
寸=cun4
蹉=cuo1
错=cuo4
笪=da2
达=da2
答=da2
大=da4
逮=dai4
代=dai4
戴=dai4
丹=dan1
郸=dan1
淡=dan4
但=dan4
党=dang3
刀=dao1
道=dao4
德=de2
登=deng1
邓=deng4
狄=di2
邸=di3
第=di4
第五=di4,wu3
典=dian3
刁=diao1
丁=ding1
定=ding4
东=dong1
东方=dong1,fang1
东郭=dong1,guo1
东门=dong1,men2
董=dong3
栋=dong4
豆=dou4
窦=dou4
督=du1
都=du1
独=du2
笃=du3
堵=du3
度=du4
杜=du4
端=duan1
端木=duan1,mu4
段=duan4
段干=duan4,gan1
顿=dun4
多=duo1
铎=duo2
额尔德特=e2,er3,de2,te4
鄂=e4
尔=er3
贰=er4
法=fa3
藩=fan1
繁=fan2
樊=fan2
范=fan4
范姜=fan4,jiang1
方=fang1
房=fang2
飞=fei1
肥=fei2
斐=fei3
费=fei4
费莫=fei4,mo4
风=feng1
丰=feng1
封=feng1
酆=feng1
逢=feng2
冯=feng2
奉=feng4
凤=feng4
佛=fo2
夫=fu1
福=fu2
浮=fu2
扶=fu2
符=fu2
伏=fu2
甫=fu3
府=fu3
富=fu4
傅=fu4
富察=fu4,cha2
改=gai3
甘=gan1
干=gan1
淦=gan4
刚=gang1
高=gao1
皋=gao1
郜=gao4
告=gao4
戈=ge1
革=ge2
盖=ge3
葛=ge3
庚=geng1
耿=geng3
恭=gong1
公=gong1
宫=gong1
弓=gong1
龚=gong1
功=gong1
公良=gong1,liang2
公叔=gong1,shu1
公孙=gong1,sun1
公西=gong1,xi1
公羊=gong1,yang2
公冶=gong1,ye3
巩=gong3
拱=gong3
贡=gong4
缑=gou1
勾=gou1
苟=gou3
辜=gu1
古=gu3
谷=gu3
谷梁=gu3,liang2
顾=gu4
瓜尔佳=gua1,er3,jia1
官=guan1
冠=guan1
关=guan1
管=guan3
贯=guan4
光=guang1
广=guang3
归=gui1
妫=gui1
桂=gui4
贵=gui4
郭=guo1
虢=guo2
国=guo2
果=guo3
过=guo4
哈=ha1
海=hai3
亥=hai4
寒=han2
邗=han2
函=han2
韩=han2
罕=han3
汉=han4
汗=han4
杭=hang2
蒿=hao1
郝=hao3
合=he2
盍=he2
禾=he2
和=he2
何=he2
赫=he4
贺=he4
赫连=he4,lian2
赫舍里=he4,she4,li3
衡=heng2
红=hong2
弘=hong2
洪=hong2
宏=hong2
闳=hong2
侯=hou2
候=hou4
厚=hou4
后=hou4
呼=hu1
呼延=hu1,yan2
斛=hu2
胡=hu2
虎=hu3
户=hu4
扈=hu4
花=hua1
滑=hua2
化=hua4
华=hua4
怀=huai2
桓=huan2
环=huan2
宦=huan4
皇=huang2
黄=huang2
皇甫=huang2,fu3
辉=hui1
回=hui2
惠=hui4
荤=hun1
浑=hun2
霍=huo4
稽=ji1
箕=ji1
机=ji1
姬=ji1
嵇=ji1
及=ji2
戢=ji2
集=ji2
籍=ji2
汲=ji2
吉=ji2
己=ji3
祭=ji4
暨=ji4
冀=ji4
蓟=ji4
季=ji4
纪=ji4
计=ji4
嘉=jia1
家=jia1
夹谷=jia1,gu3
郏=jia2
贾=jia3
甲=jia3
菅=jian
坚=jian1
检=jian3
謇=jian3
蹇=jian3
简=jian3
翦=jian3
建=jian4
剑=jian4
谏=jian4
将=jiang1
江=jiang1
姜=jiang1
蒋=jiang3
焦=jiao1
矫=jiao3
佼=jiao3
接=jie1
揭=jie1
节=jie2
竭=jie2
捷=jie2
介=jie4
金=jin1
晋=jin4
进=jin4
靳=jin4
京=jing1
荆=jing1
经=jing1
景=jing3
井=jing3
敬=jing4
镜=jing4
靖=jing4
酒=jiu3
九=jiu3
咎=jiu4
驹=ju1
鞠=ju1
居=ju1
局=ju2
剧=ju4
巨=ju4
卷=juan3
隽=juan4
军=jun1
开=kai1
阚=kan4
康=kang1
亢=kang4
抗=kang4
考=kao3
柯=ke1
可=ke3
空=kong1
孔=kong3
寇=kou4
苦=ku3
库=ku4
库雅喇=ku4,ya3,la3
蒯=kuai3
匡=kuang1
狂=kuang2
况=kuang4
邝=kuang4
旷=kuang4
夔=kui2
蒉=kui4
来=lai2
莱=lai2
赖=lai4
兰=lan2
蓝=lan2
郎=lang2
劳=lao2
牢=lao2
老=lao3
乐正=le4,zheng4
雷=lei2
类=lei4
冷=leng3
犁=li2
黎=li2
理=li3
礼=li3
李=li3
厉=li4
励=li4
力=li4
栗=li4
利=li4
郦=li4
历=li4
连=lian2
廉=lian2
敛=lian3
练=lian4
良=liang2
梁=liang2
梁丘=liang2,qiu1
聊=liao2
廖=liao4
林=lin2
蔺=lin4
零=ling2
凌=ling2
令狐=ling2,hu2
令=ling4
刘=liu2
留=liu2
柳=liu3
六=liu4
隆=long2
龙=long2
泷=long2
楼=lou2
娄=lou2
卢=lu2
鲁=lu3
逯=lu4
鹿=lu4
禄=lu4
陆=lu4
路=lu4
闾=lu:2
闾丘=lu:2,qiu1
旅=lu:3
吕=lu:3
律=lu:4
栾=luan2
伦=lun2
罗=luo2
洛=luo4
骆=luo4
麻=ma2
马=ma3
马佳=ma3,jia1
买=mai3
麦=mai4
蛮=man2
满=man3
漫=man4
芒=mang2
茆=mao2
茅=mao2
毛=mao2
卯=mao3
贸=mao4
茂=mao4
冒=mao4
么=me5
糜=mei2
梅=mei2
枚=mei2
门=men2
蒙=meng2
孟=meng4
弥=mi2
祢=mi2
弭=mi3
米=mi3
宓=mi4
秘=mi4
苗=miao2
缪=miao4
闽=min3
敏=min3
闵=min3
明=ming2
谬=miu4
摩=mo2
磨=mo2
墨=mo4
貊=mo4
莫=mo4
万俟=mo4,qi2
牟=mou2
母=mu3
睦=mu4
沐=mu4
慕=mu4
牧=mu4
穆=mu4
慕容=mu4,rong2
那=na1
纳=na4
那拉=na4,la1
纳喇=na4,la3
那兰=na4,lan2
能=nai2
佴=nai4
奈=nai4
南=nan2
南宫=nan2,gong1
南门=nan2,men2
赧=nan3
讷殷富察=ne4,yin1,fu4,cha2
泥=ni2
倪=ni2
年=nian2
念=nian4
乜=nie4
聂=nie4
宁=ning4
牛=niu2
钮=niu3
钮祜禄=niu3,hu4,lu4
农=nong2
诺=nuo4
欧=ou1
欧阳=ou1,yang2
偶=ou3
潘=pan1
盘=pan2
逄=pang2
旁=pang2
庞=pang2
裴=pei2
蓬=peng2
朋=peng2
彭=peng2
皮=pi2
辟=pi4
频=pin2
凭=ping2
平=ping2
朴=po4
仆=pu1
濮=pu2
蒲=pu2
濮阳=pu2,yang2
普=pu3
浦=pu3
溥=pu3
漆=qi1
戚=qi1
漆雕=qi1,diao1
谌=qi2
旗=qi2
亓=qi2
骑=qi2
琦=qi2
奇=qi2
祈=qi2
其=qi2
俟=qi2
綦=qi2
歧=qi2
祁=qi2
齐=qi2
亓官=qi2,guan1
杞=qi3
泣=qi4
千=qian1
牵=qian1
潜=qian2
乾=qian2
前=qian2
钱=qian2
强=qiang2
谯=qiao2
桥=qiao2
侨=qiao2
乔=qiao2
巧=qiao3
钦=qin1
琴=qin2
勤=qin2
禽=qin2
秦=qin2
清=qing1
卿=qing1
青=qing1
庆=qing4
邛=qiong2
丘=qiu1
秋=qiu1
邱=qiu1
仇=qiu2
裘=qiu2
求=qiu2
区=qu1
麴=qu1
屈=qu1
渠=qu2
瞿=qu2
璩=qu2
曲=qu3
泉=quan2
权=quan2
全=quan2
阙=que1
雀=que4
却=que4
冉=ran3
穰=rang2
壤驷=rang3,si4
让=rang4
饶=rao2
仁=ren2
壬=ren2
任=ren4
仍=reng2
融=rong2
容=rong2
戎=rong2
荣=rong2
柔=rou2
茹=ru2
汝=ru3
阮=ruan3
瑞=rui4
芮=rui4
锐=rui4
撒=sa1
萨=sa4
萨克达=sa4,ke4,da2
萨嘛喇=sa4,ma5,la3
塞=sai4
赛=sai4
三小=san1,xiao3
桑=sang1
森=sen1
僧=seng1
沙=sha1
山=shan1
闪=shan3
善=shan4
单=shan4
商=shang1
赏=shang3
尚=shang4
上官=shang4,guan1
韶=shao2
少=shao3
绍=shao4
邵=shao4
佘=she2
厍=she4
申=shen1
申屠=shen1,tu2
沈=shen3
慎=shen4
声=sheng1
生=sheng1
绳=sheng2
盛=sheng4
圣=sheng4
诗=shi1
师=shi1
施=shi1
实=shi2
石=shi2
时=shi2
始=shi3
史=shi3
市=shi4
士=shi4
世=shi4
势=shi4
侍=shi4
是=shi4
示=shi4
释=shi4
守=shou3
首=shou3
寿=shou4
受=shou4
书=shu1
疏=shu1
殳=shu1
叔=shu1
舒=shu1
舒穆禄=shu1,mu4,lu4
树=shu4
束=shu4
帅=shuai4
霜=shuang1
双=shuang1
水=shui3
税=shui4
舜=shun4
说=shuo1
硕=shuo4
斯=si1
司=si1
司空=si1,kong1
司寇=si1,kou4
司马=si1,ma3
司徒=si1,tu2
似=si4
姒=si4
松=song1
宋=song4
苏=su1
粟=su4
速=su4
素=su4
夙=su4
宿=su4
眭=sui1
睢=sui1
隋=sui2
随=sui2
孙=sun1
所=suo3
锁=suo3
索=suo3
索绰络=suo3,chuo4,luo4
他塔喇=ta1,ta3,la3
塔=ta3
台=tai2
邰=tai2
泰=tai4
太史=tai4,shi3
太叔=tai4,shu1
覃=tan2
檀=tan2
潭=tan2
郯=tan2
谭=tan2
谈=tan2
澹台=tan2,tai2
汤=tang1
堂=tang2
唐=tang2
陶=tao2
藤=teng2
腾=teng2
滕=teng2
天=tian1
田=tian2
帖=tie1
铁=tie3
通=tong1
佟=tong2
同=tong2
仝=tong2
桐=tong2
彤=tong2
童=tong2
佟佳=tong2,jia1
钭=tou3
涂=tu2
屠=tu2
图门=tu2,men2
脱=tuo1
陀=tuo2
庹=tuo3
拓跋=tuo4,ba2
完=wan2
完颜=wan2,yan2
宛=wan3
万=wan4
汪=wang1
王=wang2
望=wang4
危=wei1
威=wei1
微生=wei1,sheng1
韦=wei2
伟=wei3
隗=wei3
尾=wei3
委=wei3
位=wei4
尉=wei4
魏=wei4
卫=wei4
温=wen1
文=wen2
闻=wen2
闻人=wen2,ren2
问=wen4
翁=weng1
瓮=weng4
沃=wo4
乌=wu1
巫=wu1
邬=wu1
巫马=wu1,ma3
乌孙=wu1,sun1
乌雅=wu1,ya3
无=wu2
吾=wu2
毋=wu2
吴=wu2
五=wu3
仵=wu3
武=wu3
伍=wu3
戊=wu4
务=wu4
悟=wu4
希=xi1
析=xi1
悉=xi1
夕=xi1
郗=xi1
昔=xi1
奚=xi1
西门=xi1,men2
习=xi2
席=xi2
袭=xi2
喜=xi3
喜塔腊=xi3,ta3,la4
戏=xi4
系=xi4
夏=xia4
夏侯=xia4,hou2
鲜=xian1
仙=xian1
鲜于=xian1,yu2
咸=xian2
冼=xian3
线=xian4
香=xiang1
象=xiang4
相=xiang4
向=xiang4
项=xiang4
萧=xiao1
孝=xiao4
肖=xiao4
校=xiao4
解=xie4
谢=xie4
忻=xin1
辛=xin1
莘=xin1
信=xin4
衅=xin4
兴=xing1
星=xing1
行=xing2
刑=xing2
邢=xing2
性=xing4
姓=xing4
幸=xing4
熊=xiong2
修=xiu1
休=xiu1
须=xu1
胥=xu1
徐=xu2
许=xu3
续=xu4
绪=xu4
宣=xuan1
轩辕=xuan1,yuan2
玄=xuan2
薛=xue1
学=xue2
雪=xue3
寻=xun2
荀=xun2
鄢=yan1
烟=yan1
焉=yan1
燕=yan1
闫=yan2
言=yan2
阎=yan2
颜=yan2
延=yan2
严=yan2
晏=yan4
扬=yang2
洋=yang2
阳=yang2
羊=yang2
杨=yang2
羊舌=yang2,she2
养=yang3
仰=yang3
尧=yao2
徭=yao2
姚=yao2
野=ye3
叶=ye4
业苌=ye4,chang2
叶赫=ye4,he4
叶赫那拉=ye4,he4,na4,la1
依=yi1
衣=yi1
伊=yi1
伊尔根觉罗=yi1,er3,gen1,jue2,luo2
依尔根觉罗=yi1,er3,gen1,jue2,luo2
依尔觉罗=yi1,er3,jue2,luo2
仪=yi2
宜=yi2
夷=yi2
蚁=yi3
乙=yi3
以=yi3
义=yi4
益=yi4
易=yi4
羿=yi4
裔=yi4
奕=yi4
阴=yin1
殷=yin1
鄞=yin2
银=yin2
隐=yin3
尹=yin3
印=yin4
英=ying1
应=ying1
营=ying2
盈=ying2
嬴=ying2
雍=yong1
永=yong3
勇=yong3
用=yong4
犹=you2
游=you2
由=you2
尤=you2
有=you3
友=you3
於=yu1
愚=yu2
鱼=yu2
虞=yu2
余=yu2
于=yu2
俞=yu2
宇=yu3
庾=yu3
羽=yu3
禹=yu3
宇文=yu3,wen2
玉=yu4
毓=yu4
蔚=yu4
僪=yu4
郁=yu4
御=yu4
遇=yu4
愈=yu4
喻=yu4
尉迟=yu4,chi2
原=yuan2
源=yuan2
员=yuan2
元=yuan2
袁=yuan2
苑=yuan4
岳=yue4
越=yue4
乐=yue4
云=yun2
允=yun3
运=yun4
恽=yun4
载=zai3
宰=zai3
宰父=zai3,fu4
在=zai4
昝=zan3
臧=zang1
藏=zang4
迮=ze2
曾=zeng2
查=zha2
斋=zhai1
翟=zhai2
粘=zhan1
詹=zhan1
展=zhan3
战=zhan4
占=zhan4
湛=zhan4
章=zhang1
张=zhang1
章佳=zhang1,jia1
张简=zhang1,jian3
张廖=zhang1,liao4
仉=zhang3
长=zhang3
掌=zhang3
长孙=zhang3,sun1
招=zhao1
钊=zhao1
肇=zhao4
召=zhao4
兆=zhao4
赵=zhao4
折=zhe2
针=zhen1
甄=zhen1
真=zhen1
镇=zhen4
郑=zheng4
枝=zhi1
之=zhi1
支=zhi1
植=zhi2
止=zhi3
智=zhi4
钟=zhong1
衷=zhong1
中=zhong1
终=zhong1
锺=zhong1
锺离=zhong1,li2
钟离=zhong1,li2
种=zhong3
仲=zhong4
仲孙=zhong4,sun1
周=zhou1
诸=zhu1
朱=zhu1
诸葛=zhu1,ge3
竹=zhu2
竺=zhu2
祝=zhu4
颛孙=zhuan1,sun
庄=zhuang1
濯=zhuo2
禚=zhuo2
卓=zhuo2
资=zi1
紫=zi3
訾=zi3
字=zi4
子车=zi5,che1
宗=zong1
宗政=zong1,zheng4
纵=zong4
邹=zou1
圭=zu3
俎=zu3
祖=zu3
左=zuo3
左丘=zuo3,qiu1";
    }
}
